#include <iostream>

#if 0
    // 除数不能为0
    // 之前把一个本来可以返回int的函数，在异常判断时返回指针，也就增加了它的复杂度
    // 所以之前对于int做返回值一直都没有很好的异常代码处理机制
    // C++提供了一个异常处理机制
    // 
    int divide(int a, int b)
    {
        if(b == 0)
            throw 0; // 抛出0
        return a / b;
    }

    int main()
    {
        // 捕获异常
        // 如果没有异常，就正常运行就可以了
        try // 尝试运行某些代码
        {
            std::cout << divide(3, 1) << std::endl;
        }
        catch(int a) // 捕获某类型的异常
        {
            // 异常处理
            std::cout << "除0异常!\n";
        }

        return 0;
    }
#endif

#if 1
    int divide(int a, int b)
    {
        // throw 'a'; // 异常的类型严格匹配

        if (b == 0)
            throw 0; // 抛出0

        if (b == 2)
            throw "除数为2"; // 抛出字符串

        if (b == 3)
            throw "除数为3"; // 抛出字符串

        return a / b;
    }

    int main()
    {
        try // 尝试运行某些代码
        {
            std::cout << divide(3, 2) << std::endl;
        }
        // 依据异常的类型进行捕获
        // 异常的类型严格匹配（不存在隐式转换）
        catch (int a) // 捕获整型异常
        {
            std::cout << "除0异常!\n";
        }
        catch (char const *s) // 捕获字符串异常
        {
            std::cout << s << std::endl;
        }
        catch (...) // 捕获所有其他的异常
        {
            std::cout << "其他异常!\n";
        }

        return 0;
    }
#endif